/**
 * 渲染系统
 * 
 * 职责：
 * 1. 为 ECS 实体创建视图节点
 * 2. 同步实体数据到视图
 * 3. 通过场景协调器访问场景节点
 * 4. 更新渲染相关的组件
 * 
 * 注意：命令队列的执行由 CommandExecutionSystem 负责
 */

import { ecs } from "../../../core/ecs/ECS";
import { Node, Vec3 } from "cc";
import { ViewComponent } from "../component/ViewComponent";
import { Log } from "../../../core/logger/LoggerGlobal";
import { container, ServiceIdentifiers } from "../../../core/di";
import type { SceneCoordinator } from "../../coordinator/SceneCoordinator";

export class RenderSystem extends ecs.ComblockSystem implements ecs.ISystemUpdate {
    
    /**
     * 过滤器：处理所有有 ViewComponent 的实体
     */
    filter(): ecs.IMatcher {
        return ecs.allOf(ViewComponent);
    }
    
    /**
     * 初始化系统
     */
    init(): void {
        Log.styled('✅ 渲染系统初始化', 'success');
    }
    
    /**
     * 为实体创建视图
     * @param entity ECS 实体
     * @param bundleName bundle 名称
     * @param prefabPath 预制体路径
     * @param layerName 层级名称（默认 'game'）
     * @param position 初始位置（可选）
     * @returns 创建的节点，失败返回 null
     */
    async createEntityView(
        entity: ecs.Entity,
        bundleName: string,
        prefabPath: string,
        layerName: string = 'game',
        position?: Vec3
    ): Promise<Node | null> {
        // 通过场景协调器实例化预制体
        const node = await container.resolve<SceneCoordinator>(ServiceIdentifiers.SceneCoordinator).instantiatePrefab(
            bundleName,
            prefabPath,
            {
                layerName,
                position
            }
        );
        
        if (!node) {
            Log.ecs.error('创建实体视图失败', {
                entityId: entity.eid,
                prefabPath
            });
            return null;
        }
        
        // 添加或获取 ViewComponent
        let viewComp = entity.get(ViewComponent);
        if (!viewComp) {
            viewComp = new ViewComponent();
            entity.add(viewComp);
        }
        
        // 初始化 ViewComponent
        viewComp.init(node);
        viewComp.layerName = layerName;
        
        // 将实体 ID 存储到节点上（方便反向查找）
        (node as any).__entityId = entity.eid;
        
        Log.ecs.debug('为实体创建视图', {
            entityId: entity.eid,
            nodeName: node.name
        });
        
        return node;
    }
    
    /**
     * 批量创建实体视图
     */
    async createEntityViewBatch(
        entities: ecs.Entity[],
        bundleName: string,
        prefabPath: string,
        layerName: string = 'game'
    ): Promise<Node[]> {
        const nodes: Node[] = [];
        
        for (const entity of entities) {
            const node = await this.createEntityView(entity, bundleName, prefabPath, layerName);
            if (node) {
                nodes.push(node);
            }
        }
        
        return nodes;
    }
    
    /**
     * 更新渲染（每帧调用）
     */
    update(entity: ecs.Entity): void {
        const viewComp = entity.get(ViewComponent);
        if (!viewComp || !viewComp.isReady || !viewComp.node) {
            return;
        }
        
        // 这里可以根据其他组件更新视图
        // 例如：
        // - 同步位置、旋转、缩放
        // - 更新 Sprite
        // - 播放动画
        // - 更新 UI
        
        // 示例：如果实体有 TransformComponent，同步到节点
        // const transform = entity.get(TransformComponent);
        // if (transform) {
        //     viewComp.node.setPosition(transform.x, transform.y, 0);
        //     viewComp.node.setRotationFromEuler(0, 0, transform.rotation);
        //     viewComp.node.setScale(transform.scaleX, transform.scaleY, 1);
        // }
    }
    
    /**
     * 销毁实体的视图
     */
    destroyEntityView(entity: ecs.Entity): void {
        const viewComp = entity.get(ViewComponent);
        if (viewComp) {
            viewComp.destroyNode();
            entity.remove(ViewComponent);
            Log.ecs.debug('销毁实体视图', { entityId: entity.eid });
        }
    }
    
    /**
     * 设置实体可见性
     */
    setEntityVisible(entity: ecs.Entity, visible: boolean): void {
        const viewComp = entity.get(ViewComponent);
        if (viewComp) {
            viewComp.setVisible(visible);
        }
    }
    
    /**
     * 播放实体动画
     */
    playEntityAnimation(entity: ecs.Entity, animName: string, loop: boolean = false): void {
        const viewComp = entity.get(ViewComponent);
        if (viewComp && viewComp.animation) {
            viewComp.playAnimation(animName, loop);
        }
    }
    
    /**
     * 系统销毁时清理
     */
    onDestroy(): void {
        Log.ecs.info('🛑 渲染系统销毁');
    }
}

/**
 * 导出渲染系统实例
 */
export const renderSystem = new RenderSystem();